/*
package com.fenda.reflect;

*/
/**
 * Created by huanggc on 2019/11/7.
 *//*


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

*/
/**
 *
 * 设计模式好处：提升代码的可复用性与拓展性
 *
 * 有一个类，叫用户处理类
 * 方法1：添加用户
 * 方法2：修改用户
 * 方法3：删除用户
 * 方法4：查询用户
 * 需求，记录每一个方法的执行时间
 *
 * 为什么需要代理？
 *  我们希望业务操作类本身代码的纯粹
 *
 *  动态代理：
 *      InvocationHandler：核心关键类
 *
 *//*


interface  UserInterface{
    public void addUser();
    public void updateUser();
    public void deleteUser();
    public void findUser();
}

class UserOperator implements UserInterface{
    public void addUser(){
        System.out.println("添加用户");
    }

    public void updateUser(){
        System.out.println("修改用户");
    }

    @Override
    public void deleteUser() {
        System.out.println("删除用户");
    }

    @Override
    public void findUser() {
        System.out.println("查询用户");
    }
}

//用户代理类：专门统计时间
class UserProxy implements UserInterface{
    UserOperator uo;

    public UserProxy(UserOperator uo) {
        this.uo = uo;
    }

    public void addUser(){
        long start = System.currentTimeMillis();
        uo.addUser();
        long end = System.currentTimeMillis();
        System.out.println("添加花费了" + (end - start) + "ms");
    }

    public void updateUser(){
        long start = System.currentTimeMillis();
        uo.updateUser();
        long end = System.currentTimeMillis();
        System.out.println("修改花费了" + (end - start) + "ms");
    }

    @Override
    public void deleteUser() {
        long start = System.currentTimeMillis();
        uo.deleteUser();
        long end = System.currentTimeMillis();
        System.out.println("删除花费了" + (end - start) + "ms");
    }

    @Override
    public void findUser() {

    }

}

class MyProxyHandler implements InvocationHandler{

    //被代理的对象
    private Object src;

    public MyProxyHandler(Object src) {
        this.src = src;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long start = System.currentTimeMillis();
        Object invoke = method.invoke(src, args);
        long end = System.currentTimeMillis();
        System.out.println(method.getName() + "花费了" + (end - start) + "ms");
        return invoke;
    }
}


public class DongtaiDaili {
    public static void main(String[] args) {
        */
/*UserOperator uo = new UserOperator();
        UserProxy up = new UserProxy(uo);
        up.addUser();
        up.deleteUser();
        up.updateUser();*//*

        //动态代理的调用
        UserInterface uo = new UserOperator();//用户操作类
        UserInterface proxy = (UserInterface) Proxy.newProxyInstance(uo.getClass().getClassLoader(),new Class[]{UserInterface.class},new MyProxyHandler(uo));
        proxy.addUser();
        proxy.deleteUser();
        proxy.updateUser();
        proxy.findUser();

    }
}

*/
